package cn.wolfcode.crm.web.advice;

import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class ExceptionHandlerControllerAdvice {
    //抽方法：因为里面重复代码太多，不同的地方只有视图路径和响应的信息
    private ModelAndView getModelAndView(HandlerMethod method, String viewName, String jsonMsg) {
        //根据访问的处理方法，到底是响应 JSON 还是 HTML
        //根据方法是否贴了 @ResponseBody(JSON注解) 这个注解 就知道是哪个
        ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class);
        if (responseBody == null) {//为空则响应HTML
            ModelAndView mv = new ModelAndView();
            mv.setViewName(viewName);
            return mv;
        } else {//有值则响应JSON
            Map<String, Object> map = new HashMap<>();
            map.put("success", false);
            map.put("msg", jsonMsg);

            ModelAndView mv = new ModelAndView(new MappingJackson2JsonView(), map);
            return mv;
        }
    }

    //根据抛出的异常来到这里去匹配
//若处理方法抛出异常属于这个 UnauthorizedException 或者是他的子类，就调这个方法
    @ExceptionHandler(UnauthorizedException.class)
    public ModelAndView handlerUnauthorizedException(Exception e, HandlerMethod method) {
        return getModelAndView(method, "common/nopermission", "您没有此操作权限，请重新选择");
    }

    //若处理方法抛出异常属于这个 Exception 或者是他的子类，就调这个方法
    @ExceptionHandler(Exception.class)
    public ModelAndView handlerException(Exception e, HandlerMethod method) {
        return getModelAndView(method, "common/error", "网站繁忙请稍后重试");

    }
}
